﻿#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>

using namespace std;

char map[3001][3001];
char origin[6][6];	

int N = 1;	//N could only be 3, 4 or 5
int Q;		//Q which is the Scale Level of the picture

void draw(int Q, int x, int y)
{
	if (Q == 1)	//如果Q为1，则为递归的最后一步，输出一遍复制模板即可
	{
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				map[x + i][y + j] = origin[i][j];
		return;
	}

	//如果m不是1，则开始进行递归，直至m为1
	int size = (int)pow(N * 1.0, Q - 1);	//Q表示当前的阶数，每一个Q都有一个对应的size，所以每一次size都要重算一下
	//这个循环根据当前的Q和size，重新确定左上角的坐标，从而让其进行绘制
	//这里进行了Q-1用于获取计算size的值，改变Q值在下一步进行
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (origin[i][j] != ' ')	//同时也要注意的是，模板里没有数值的部位，也就不进行二次绘制。
				draw(Q - 1, x + i * size, y + j * size);	//在这里进行函数的递归调用时，才将Q的值修改后输出
		}
	}
}

int main()
{
	while (N)	//这题因为明确说明n为0时，停止输入，所以可以如此判断
	{
		cin >> N;
		if (N == 0)
		{
			break;
		}

		//这里因为是全部输入再全部输出，所以有时候需要获取掉多余的换行符，方便后续进一步的输入数据
		int c = getchar();	//因为这里获取到N后，获取换行符

		for (int i = 0; i < N; i++)	//输入模板
		{
			cin.getline(origin[i],6);	//多读取一些，因为只能是3、4、5，所以选择6可以保证换行符也会读入。不影响下一步的读入
		}
		int Q;		//确认复制次数
		cin >> Q;
		int size = (int)pow(N * 1.0, Q);		//复制后的图形规模，是N的Q次方
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				map[i][j] = ' ';	//初始化size内容
			}
			map[i][size] = '\0';	//给每一行末尾插入终止符，保证后续不会输出
		}

		//写入函数，通过不断递归将map地图进行修正和重复
		draw(Q, 0, 0);


		for (int i = 0; i < size; i++)
		{
			cout << map[i] << endl;		//因为已经手动插入过终止符，所以可以直接逐行输出
			//如果没有map[i][size] = '\0'这样手动分割，那输出的时候，就按照初始化时逐个输入时候那样，逐个输出。
		}
	}

	return 0;
}



